/*
 * DFCInput.h
 *
 *  Created on: 11/01/2011
 *      Author: Danilo
 */

#ifndef DFCINPUT_H_INCLUDED
#define DFCINPUT_H_INCLUDED

#include "DFCObject.h"
#include "DFCVector.h"
#include "DFCIncludes.h"

// Prot�tipo de classe
class DFCMain;

//!Classe DFCInput: Controla input
class DFCInput: public DFCObject
{
    private:
    //!Array de estado anterior das teclas
    Uint8 PrevKeyStates[SDLK_LAST];

    //!Array de estado atual das teclas
    Uint8 KeyStates[SDLK_LAST];

    //!DFCVector com coordenadas da posi��o atual do cursor do mouse
    DFCVector MousePos;

    //!N�mero de teclas do teclado
    int iNumKeys;

    /*!
     * L� dados do teclado
     * @return true se bem sucedido, false se houve erro
     */
    bool ReadKeyboard(SDL_Event *Event);

    /*!
     * L� dados do mouse
     * @return true se bem sucedido, false se houve erro
     */
    bool ReadMouse(SDL_Event *Event);

    public:
    //!Ponteiro com refer�ncia para DFCMain
    DFCMain *pr_Main;

    /*!
     * Construtor padr�o
     */
    DFCInput();

    /*!
     * Destrutor padr�o
     */
    virtual ~DFCInput();

    /*!
     * Libera a classe da mem�ria
     * @return true se bem sucedido, false se houve erro
     */
    bool Release();

    /*!
     * Inicializa os eventos do SDL subsystem
     * @return true se bem sucedido, false se houve erro
     */
    bool Initialize();

    /*!
     * L� as entradas de teclado e mouse
     * @return true se bem sucedido, false se houve erro
     */
    bool Read(SDL_Event *Event);

    /*!
     * Retorna a posi��o do mouse
     * @return DFCVector com a posi��o do cursos do mouse
     */
    inline DFCVector GetMousePos() { return MousePos; };

    /*!
     * Verifica se tecla est� pressionada
     * @param cKeyCode: c�digo da tecla
     * @return true se a tecla estiver pressionada, false se n�o
     */
    bool KeyDown(const SDLKey cKeyCode);

    /*!
     * Verifica se a tecla foi pressionada
     * @param cKeyCode: c�digo da tecla
     * @return true se a tecla tiver sido pressionada, false se n�o
     */
    bool KeyPressed(const SDLKey cKeyCode);

    /*!
     * Verifica se a tecla foi soltada
     * @param cKeyCode: c�digo da tecla
     * @return true se a tecla tiver sido soltada, false se n�o
     */
    bool KeyReleased(const SDLKey cKeyCode);

    //TO-DO: MouBtnDown
    //TO-DO: MouBtnPressed
    //TO-DO: MouBtnReleased
    //TO-DO: SetWindowsMousePos

};

#endif // DFCINPUT_H_INCLUDED
